package com.feinno.notify;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;

public class DateFormatTest {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            System.out.println("第" + (i + 1) + "次循环");
            test();
            System.out.println();
        }
    }

    private static void test() {
        ZoneId zoneId = ZoneId.systemDefault();
        DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        Date date = new Date();
        String dateStr = "2018-07-12 18:20:11";

        int count = 10000;
        System.out.println("执行" + count + "次");

        long start = System.nanoTime();
        for (int i = 0; i < count; i++) {
            String landing = toString(format, zoneId, date);
        }
        long end = System.nanoTime();
        System.out.println("LocalDate toString: " + (end - start) + " 纳秒");

        start = System.nanoTime();
        for (int i = 0; i < count; i++) {
            String landing = toString(date);
        }
        end = System.nanoTime();
        System.out.println("Date toString: " + (end - start) + " 纳秒");

        start = System.nanoTime();
        for (int i = 0; i < count; i++) {
            Date landing = toDate(format, zoneId, dateStr);
        }
        end = System.nanoTime();
        System.out.println("LocalDate toDate: " + (end - start) + " 纳秒");

        start = System.nanoTime();
        for (int i = 0; i < count; i++) {
            Date landing = toDate(dateStr);
        }
        end = System.nanoTime();
        System.out.println("Date toDate: " + (end - start) + " 纳秒");
    }

    public static Date toDate(DateTimeFormatter format, ZoneId zoneId, String dateStr) {
        ZonedDateTime zdt = LocalDateTime.parse(dateStr, format).atZone(zoneId);
        return Date.from(zdt.toInstant());
    }

    public static String toString(DateTimeFormatter format, ZoneId zoneId, Date date) {
        // atZone()方法返回在指定时区从此Instant生成的ZonedDateTime。
        LocalDateTime localDateTime = date.toInstant().atZone(zoneId).toLocalDateTime();
        return localDateTime.format(format);
    }

    public static Date toDate(String dateStr) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        try {
            return format.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static String toString(Date date) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        return format.format(date);
    }
}

/**
执行结果
总体使用LocalDate的性能最佳

第1次循环
执行1次
LocalDate toString: 2576032 纳秒
Date toString: 39044434 纳秒
LocalDate toDate: 7113953 纳秒
Date toDate: 1118265 纳秒

第2次循环
执行1次
LocalDate toString: 73073 纳秒
Date toString: 363313 纳秒
LocalDate toDate: 198283 纳秒
Date toDate: 276282 纳秒

第3次循环
执行1次
LocalDate toString: 68147 纳秒
Date toString: 181451 纳秒
LocalDate toDate: 193356 纳秒
Date toDate: 311587 纳秒

第4次循环
执行1次
LocalDate toString: 69379 纳秒
Date toString: 208135 纳秒
LocalDate toDate: 187198 纳秒
Date toDate: 362082 纳秒

第5次循环
执行1次
LocalDate toString: 68558 纳秒
Date toString: 231535 纳秒
LocalDate toDate: 175293 纳秒
Date toDate: 273408 纳秒
--------------------------------------------------------
第1次循环
执行10次
LocalDate toString: 2199582 纳秒
Date toString: 42180008 纳秒
LocalDate toDate: 10621051 纳秒
Date toDate: 7065511 纳秒

第2次循环
执行10次
LocalDate toString: 622764 纳秒
Date toString: 2117478 纳秒
LocalDate toDate: 1793575 纳秒
Date toDate: 3556361 纳秒

第3次循环
执行10次
LocalDate toString: 887140 纳秒
Date toString: 2104751 纳秒
LocalDate toDate: 1684376 纳秒
Date toDate: 3076460 纳秒

第4次循环
执行10次
LocalDate toString: 932298 纳秒
Date toString: 1825596 纳秒
LocalDate toDate: 1310390 纳秒
Date toDate: 2521842 纳秒

第5次循环
执行10次
LocalDate toString: 687216 纳秒
Date toString: 1968868 纳秒
LocalDate toDate: 1846122 纳秒
Date toDate: 2755430 纳秒
-----------------------------------------------------------
第1次循环
执行100次
LocalDate toString: 7296636 纳秒
Date toString: 48672430 纳秒
LocalDate toDate: 18744071 纳秒
Date toDate: 22088602 纳秒

第2次循环
执行100次
LocalDate toString: 4858950 纳秒
Date toString: 9462145 纳秒
LocalDate toDate: 8908760 纳秒
Date toDate: 18510072 纳秒

第3次循环
执行100次
LocalDate toString: 2523896 纳秒
Date toString: 10254865 纳秒
LocalDate toDate: 7964557 纳秒
Date toDate: 15424582 纳秒

第4次循环
执行100次
LocalDate toString: 1523040 纳秒
Date toString: 8478122 纳秒
LocalDate toDate: 7623002 纳秒
Date toDate: 19781051 纳秒

第5次循环
执行100次
LocalDate toString: 2686052 纳秒
Date toString: 9887037 纳秒
LocalDate toDate: 7114363 纳秒
Date toDate: 12737297 纳秒

-------------------------------------------------------------------------
第1次循环
执行1000次
LocalDate toString: 35921996 纳秒
Date toString: 136837175 纳秒
LocalDate toDate: 87476708 纳秒
Date toDate: 112279688 纳秒

第2次循环
执行1000次
LocalDate toString: 5394683 纳秒
Date toString: 26940573 纳秒
LocalDate toDate: 38921687 纳秒
Date toDate: 35761481 纳秒

第3次循环
执行1000次
LocalDate toString: 3301015 纳秒
Date toString: 22546335 纳秒
LocalDate toDate: 76411470 纳秒
Date toDate: 32892746 纳秒

第4次循环
执行1000次
LocalDate toString: 3049365 纳秒
Date toString: 22145664 纳秒
LocalDate toDate: 38189724 纳秒
Date toDate: 83981515 纳秒

第5次循环
执行1000次
LocalDate toString: 9832437 纳秒
Date toString: 112724695 纳秒
LocalDate toDate: 18661555 纳秒
Date toDate: 29538363 纳秒
---------------------------------------------------------------------
第1次循环
执行10000次
LocalDate toString: 132152286 纳秒
Date toString: 628709845 纳秒
LocalDate toDate: 588720387 纳秒
Date toDate: 737044818 纳秒

第2次循环
执行10000次
LocalDate toString: 9662480 纳秒
Date toString: 265976221 纳秒
LocalDate toDate: 44466211 纳秒
Date toDate: 94855859 纳秒

第3次循环
执行10000次
LocalDate toString: 14524715 纳秒
Date toString: 42617626 纳秒
LocalDate toDate: 177132472 纳秒
Date toDate: 120956092 纳秒

第4次循环
执行10000次
LocalDate toString: 11384624 纳秒
Date toString: 67043335 纳秒
LocalDate toDate: 18817965 纳秒
Date toDate: 97180652 纳秒

第5次循环
执行10000次
LocalDate toString: 168661740 纳秒
Date toString: 46310281 纳秒
LocalDate toDate: 16597446 纳秒
Date toDate: 48316096 纳秒

*/